package com.lw.controller;

import cn.dev33.satoken.annotation.SaCheckPermission;
import com.lw.common.aop.LogOperation;
import com.lw.common.enums.LogModuleEnum;
import com.lw.common.utils.ResultVo;
import com.lw.common.utils.StrUtils;
import com.lw.common.vo.Option;
import com.lw.common.vo.RouteVO;
import com.mybatisflex.core.paginate.Page;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.*;
import com.lw.entity.TbMenu;
import com.lw.service.TbMenuService;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import java.util.List;

/**
 * 菜单管理 控制层。
 *
 * @author lw
 * @since 2025年05月13日 22:02:37
 */
@RestController
@Tag(name = "03-菜单管理接口")
@RequestMapping("/tbMenu")
public class TbMenuController {

    @Resource
    private TbMenuService tbMenuService;

    /**
     * 添加菜单管理。
     *
     * @param tbMenu 菜单管理
     * @return {@code true} 添加成功，{@code false} 添加失败
     */
    @PostMapping("save")
    @Operation(description="保存菜单管理")
    @SaCheckPermission("sys:menu:add")
    @LogOperation(module = LogModuleEnum.LOG_MENU, value = "保存菜单管理", params = false,result = false)
    public ResultVo<Boolean> saveMenu(@RequestBody @Parameter(description="菜单管理")TbMenu tbMenu) {
        return ResultVo.success(tbMenuService.saveMenu(tbMenu));
    }

    /**
     * 根据主键删除菜单管理。
     *
     * @param id 主键
     * @return {@code true} 删除成功，{@code false} 删除失败
     */
    @DeleteMapping("deleteMenu/{id}")
    @Operation(description="根据主键删除菜单管理")
    @SaCheckPermission("sys:menu:delete")
    @LogOperation(module = LogModuleEnum.LOG_MENU, value = "根据主键删除菜单管理", params = false,result = false)
    public ResultVo<Boolean> deleteMenu(@PathVariable("id") @Parameter(description="菜单管理主键")Long id) {
        // 校验主键是否为空
        if (id==null) {
            return ResultVo.error("主键不能为空");
        }
        return ResultVo.success(tbMenuService.deleteMenu(id));
    }

    /**
     * 根据主键更新菜单管理。
     *
     * @param tbMenu 菜单管理
     * @return {@code true} 更新成功，{@code false} 更新失败
     */
    @PutMapping("update")
    @Operation(description="根据主键更新菜单管理")
    @SaCheckPermission("sys:menu:edit")
    @LogOperation(module = LogModuleEnum.LOG_MENU, value = "根据主键更新菜单管理", params = false,result = false)
    public ResultVo<Boolean> update(@RequestBody @Parameter(description="菜单管理主键")TbMenu tbMenu) {
        // 校验主键是否为空
        if (tbMenu.getId()==null) {
            return ResultVo.error("主键不能为空");
        }
        return ResultVo.success(tbMenuService.saveMenu(tbMenu));
    }

    /**
     * 查询所有菜单管理。
     *
     * @return 所有数据
     */
    @GetMapping("list")
    @Operation(description="查询所有菜单管理")
    public ResultVo<List<TbMenu>> list() {
        return ResultVo.success(tbMenuService.list());
    }

    /**
     * 根据菜单管理主键获取详细信息。
     *
     * @param id 菜单管理主键
     * @return 菜单管理详情
     */
    @GetMapping("getInfo/{id}")
    @Operation(description="根据主键获取菜单管理")
    public ResultVo<TbMenu> getInfo(@PathVariable("id") Long id) {
        return ResultVo.success(tbMenuService.getById(id));
    }

    /**
     * 分页查询菜单管理。
     *
     * @param page 分页对象
     * @return 分页对象
     */
    @GetMapping("page")
    @Operation(description="分页查询菜单管理")
    public ResultVo<Page<TbMenu>> page(@Parameter(description="分页信息")Page<TbMenu> page) {
        return ResultVo.success(tbMenuService.page(page));
    }

    @Operation(summary = "菜单路由列表")
    @GetMapping("routes")
    public ResultVo<List<RouteVO>> getCurrentUserRoutes() {
        List<RouteVO> routeList = tbMenuService.getCurrentUserRoutes();
        return ResultVo.success(routeList);
    }

    @Operation(summary = "菜单下拉列表")
    @GetMapping("getMenuOptions")
    public ResultVo<List<Option<Long>>> getMenuOptions(
            @Parameter(description = "是否只查询父级菜单")
            @RequestParam(required = false, defaultValue = "false",name = "onlyParent") boolean onlyParent
    ) {
        List<Option<Long>> menus = tbMenuService.listMenuOptions(onlyParent);
        return ResultVo.success(menus);
    }
    @Operation(summary = "菜单列表")
    @GetMapping(value = "getMenusTree")
    public ResultVo<List<TbMenu>> getMenusTree(TbMenu queryParams) {
        List<TbMenu> menuList = tbMenuService.getMenusTree(queryParams);
        return ResultVo.success(menuList);
    }
}
